import svg.path
from xml.dom import minidom
import numpy as np

def parse_svg(svg_file):
    """
    解析 SVG 文件并提取路径数据
    """
    # 加载 SVG 文件
    doc = minidom.parse(svg_file)
    path_strings = [path.getAttribute("d") for path in doc.getElementsByTagName("path")]
    doc.unlink()
    
    # 解析路径
    parsed_paths = []
    for path_string in path_strings:
        path_data = svg.path.parse_path(path_string)
        parsed_paths.append(path_data)
    return parsed_paths

def path_to_gcode(paths, feedrate=1000, z_cut=-1, z_travel=5):
    """
    将 SVG 路径转换为 G-code
    """
    gcode_lines = []
    
    # 初始化 G-code
    gcode_lines.append("G21 ; Set units to millimeters")
    gcode_lines.append("G90 ; Absolute positioning")
    gcode_lines.append("G17 ; XY plane selection")
    
    for path in paths:
        # 切换到安全位置
        start_point = path[0].start
        gcode_lines.append(f"G0 Z{z_travel} ; Move to travel height")
        gcode_lines.append(f"G0 X{start_point.real:.3f} Y{start_point.imag:.3f} ; Move to path start")

        # 切割路径
        gcode_lines.append(f"G1 Z{z_cut} F{feedrate} ; Lower to cutting depth")
        for segment in path:
            end_point = segment.end
            gcode_lines.append(f"G1 X{end_point.real:.3f} Y{end_point.imag:.3f} F{feedrate}")
        
        # 回到安全高度
        gcode_lines.append(f"G0 Z{z_travel} ; Retract")
    
    # 完成
    gcode_lines.append("M30 ; Program end")
    return "\n".join(gcode_lines)

def save_gcode(gcode, output_file):
    """
    保存 G-code 到文件
    """
    with open(output_file, "w") as f:
        f.write(gcode)

# 示例用法
svg_file = "./src/utils/SVGnest-output.svg"
output_file = "./src/utils/output2.gcode"

# 解析 SVG 路径
paths = parse_svg(svg_file)

# 转换为 G-code
gcode = path_to_gcode(paths)

# 保存 G-code
save_gcode(gcode, output_file)
print(f"G-code 已保存至 {output_file}")
